from flask import request, render_template, flash
from flask_login import current_user
from app.commons import is_isbn_or_key
from app.forms.book import SearchForm
from app.models.gift import Gift
from app.models.wish import Wish
from app.spider.yushu_book import YuShuBook
from app.view_models.book import BookCollection, BookViewModel
from app.view_models.trade import TradeInfo
from . import web


# 搜索api
@web.route('/book/search')
def search():
    ''' wtforms扩展优点: 反序列化实现方便,提供的类和函数众多,满足大部分参数的验证需求.
        wtforms扩展缺点: 前后端分离情况下不够灵活,可以验证数据,但对于数据的error信息返回十分麻烦.
        其他: wtforms扩展可以只用来验证参数,通过flash()方法来返回错误,但前后端分离情况下还是不够灵活. '''
    form = SearchForm(request.args)
    books = BookCollection()  # view_model层,通过面向对象的方式完成数据处理.

    if form.validate():
        q = form.q.data.strip() # 去掉空格
        page = form.page.data
        isbn_or_key = is_isbn_or_key(q)
        yushu_book = YuShuBook() # 实例化请求数据对象

        if isbn_or_key == 'isbn':
            yushu_book.search_by_isbn(q)
        else:
            yushu_book.search_by_keyword(q, page)

        books.fill(yushu_book, q) # 对数据进行处理
        # return json.dumps(books, default=lambda o:o.__dict__) # 先执行匿名函数,再对返回值进行序列化操作.
    else:
        flash('搜索失败')
    return render_template('search_result.html', books=books)


@web.route('/book/<isbn>/detail')
def book_detail(isbn):
    if isbn is None:
        return flash('参数不能为空')
    # 两个开关,没有登陆展示赠送书籍的用户 -> 第一种情况(默认情况)
    has_in_gifts = False
    has_in_wishes = False

    yushu_book = YuShuBook()
    yushu_book.search_by_isbn(isbn)
    book = BookViewModel(yushu_book.first)

    # 登陆情况下,修改开关返回值
    if current_user.is_authenticated:
        if Gift.query.filter_by(uid=current_user.id, isbn=isbn, launched=False).first():
            has_in_gifts = True # 第二种情况,我赠送过这本书,展示想要这本书的用户

        if Wish.query.filter_by(uid=current_user.id, isbn=isbn, launched=False).first():
            has_in_wishes = True # 第三种情况,我的清单中有这本书,展示赠送这本书的用户(默认就是展示赠送者)

    # 拿到赠送本书的所有用户
    trade_gifts = Gift.query.filter_by(isbn=isbn, launched=False).all()
    # 拿到索取本书的所有用户
    trade_wishs = Wish.query.filter_by(isbn=isbn, launched=False).all()
    trade_gift_model = TradeInfo(trade_gifts)
    trade_wish_model = TradeInfo(trade_wishs)

    return render_template('book_detail.html', book=book, wishes=trade_wish_model,
                           gifts=trade_gift_model, has_in_gifts=has_in_gifts,
                           has_in_wishes=has_in_wishes)